package com.cap.bts.crmdp.dealer.coupon.service;

import java.util.List;

import com.cap.bts.crmdp.dealer.coupon.domain.Eligibility;
import com.cap.bts.crmdp.dealer.coupon.domain.EligibilityLine;
import com.cap.bts.crmdp.dealer.coupon.domain.Ticket;
import com.cap.bts.crmdp.dealer.coupon.domain.TicketLine;
import com.cap.bts.crmdp.dealer.coupon.domain.TicketLinePriceModel;
import com.cap.bts.crmdp.dealer.coupon.domain.TicketPriceOfDealer;
import com.cap.bts.crmdp.dealer.coupon.dto.DealerInScopeDto;
import com.cap.bts.crmdp.dealer.coupon.dto.ProductTypesDto;
import com.cap.bts.crmdp.dealer.coupon.dto.TicKetDefineDto;
import com.cap.bts.crmdp.dealer.coupon.dto.TicketLinePriceDto;
import com.cap.bts.crmdp.dealer.masterinfo.dto.OtherProductDto;
import com.cap.bts.crmdp.dealer.masterinfo.dto.ServiceInfoDefDto;
import com.cap.bts.crmdp.dealer.masterinfo.dto.TyreProductDto;
import com.cap.bts.framework.codemapping.domain.CodeInfo;
import com.cap.bts.framework.common.exception.AppException;
import com.cap.bts.framework.common.service.IBaseService;

/**
 *
 */
public interface ITicKetDefineService extends IBaseService {

    /**
     * 新增提货券和优惠券信息
     * @param couponBatchDto
     * @return
     * @throws AppException 
     */
    public Ticket insertTicketInfo(TicKetDefineDto ticKetDefineDto) throws AppException;

    /**
     * 新增行信息
     * @param ticKetDefineDto
     * @return
     * @throws AppException
     */
    public TicketLine insertTicketLineInfo(TicKetDefineDto ticKetDefineDto) throws AppException;

    /**
     * 提货券和优惠券信息查询
     * @param ticKetDefineDto
     * @return
     * @throws AppException
     */
    public List<Ticket> getTicketList(TicKetDefineDto ticKetDefineDto) throws AppException;

    /**
     * 根据优惠券名称查询信息
     * @param ticKetDefineDto
     * @return
     * @throws AppException
     */
    public boolean getTicketByTicketName(TicKetDefineDto ticKetDefineDto) throws AppException;

    /**
     * 取得优惠券定义列表 
     * @Date        :      Sep 10, 2015
     * @return
     * @throws AppException
     */
    public List<Ticket> getCouponTicketList() throws AppException;

    /**
     * 根据优惠券和提货券ID查询信息
     * @param id
     * @return
     * @throws AppException
     */
    public Ticket getTicketById(String id) throws AppException;

    /**
     * 查询所有的优惠券和提货券信息
     * @return
     * @throws AppException
     */
    public List<Ticket> getAllTicketList() throws AppException;

    /**
     * 根据优惠券和提货券ID查询其详细信息
     * @param ticketId
     * @return
     * @throws AppException
     */
    public List<TicketLine> getTicketLineInfoList(String ticketId) throws AppException;

    /**
     * 根据优惠券和提货券的详细信息的ID查询其详细信息
     * @param id
     * @return
     * @throws AppException
     */
    public TicketLine getTicketLineInfoById(Long id) throws AppException;

    /**
     * 修改优惠券和提货券信息
     * @param ticKetDefineDto
     * @return
     * @throws AppException
     */
    public boolean updateTicketInfo(TicKetDefineDto ticKetDefineDto) throws AppException;

    /**
     * 根据ID删除优惠券和提货券的详细信息
     * @param ticKetDefineDto
     * @return
     * @throws AppException
     */
    public boolean removeTiketLineInfo(TicKetDefineDto ticKetDefineDto) throws AppException;

    /**
     * 优惠券和提货券的详细信息修改
     * @param ticKetDefineDto
     * @return
     * @throws AppException
     */
    public boolean updateTiketLineInfo(TicKetDefineDto ticKetDefineDto) throws AppException;

    /**
     * 根据ID删除优惠券和提货券的信息
     * @param id
     * @return
     * @throws AppException
     */
    public boolean removeTicketInfo(Long id) throws AppException;

    /**
     * 根据ticketDefId删除优惠券和提货券的详细信息
     * @param ticketDefId
     * @return
     * @throws AppException
     */
    public boolean removeTicketLineInfoByTicketDefId(Long ticketDefId) throws AppException;

    /**
     * 根据优惠券名称查询信息
     * @param ticKetDefineDto
     * @return
     * @throws AppException
     */
    public Ticket getTicketByTicketName2(TicKetDefineDto ticKetDefineDto) throws AppException;

    /**
     * 适用范围界面--获取商品类型
     * @Date        :      2015年10月20日
     * @return
     * @throws AppException
     */
    public List<ProductTypesDto> getProductTypes() throws AppException;

    /**
     *  适用范围界面--获取对应商品类型下的属性对应的描述
     * @Date        :      2015年10月20日
     * @param code
     * @return
     * @throws AppException
     */
    public String getDescriptionOfProduct(String value) throws AppException;

    /**
     * 适用范围界面--获取对应商品类型下的属性
     * @Date        :      2015年10月23日
     * @param id
     * @return
     * @throws AppException
     */
    public List<Eligibility> getEligibilityByTicketLineId(Long id) throws AppException;
    
    /**
     * @Date        :      2015年11月17日
     * @param id
     * @throws AppException
     */
    public void removeEligibilityByTicketLineId(Long id) throws AppException;
    
    /**
     * @Date        :      2015年11月17日
     * @param id
     * @return
     * @throws AppException
     */
    public List<EligibilityLine> getEligibilityLineByEligibilityId(Long id) throws AppException;

    /**
     * 适用范围界面--检查是否已存在该行，从而判断是新增还是修改
     * @Date        :      2015年10月25日
     * @param partTypeIdList
     * @param ticketLineId
     * @return
     * @throws AppException
     */
    public boolean isExitsRow(Long id) throws AppException;
    
    
    /**
     * 适用范围界面--检查头表中是否已存在该行，从而判断是新增还是修改
     * @Date        :      2015年11月13日
     * @param id
     * @return
     * @throws AppException
     */
    public Long isExitsRowInEligibility(Long id) throws AppException;

    /**
     * 适用范围界面--新增行
     * @Date        :      2015年10月25日
     * @param ticketLineId
     * @param partType
     * @param attrName
     * @param operator
     * @param attrValue
     * @return
     * @throws AppException
     */
    public boolean saveRow(Long eligibilityId,String attrName, String operator,String attrValue) throws AppException;

    /**
     * 适用范围界面--修改行
     * @Date        :      2015年10月25日
     * @param ticketLineId
     * @param partType
     * @param attrName
     * @param operator
     * @param attrValue
     * @return
     * @throws AppException
     */
    public void changeRow(Long eligibilityId,String attrName, String operator,
                          String attrValue, String eligibilityLineId) throws AppException;
    
    /**
     * @Date        :      2015年11月13日
     * @param ticketLineId
     * @param category
     * @param name
     * @param marsIntegrated
     * @throws AppException
     */
    public void changeRowInEligibility(Long ticketLineId, String category, String name, String marsIntegrated,Long id) throws AppException;
    
    /**
     * @Date        :      2015年11月13日
     * @param ticketLineId
     * @param category
     * @param name
     * @param marsIntegrated
     * @throws AppException
     */
    public void saveRowInEligibility(Long ticketLineId, String category, String name, String marsIntegrated) throws AppException;

    /**
     * 适用范围界面--删除行
     * @Date        :      2015年10月26日
     * @param eligibilityId
     * @throws AppException
     */
    public void removeRow(Long eligibilityLineId) throws AppException;
    
    /**
     * @Date        :      2015年11月17日
     * @param eligibilityId
     * @throws AppException
     */
    public void removeRowByEligibilityId(Long eligibilityId) throws AppException;

    /**
     * 适用范围界面--预览界面判断属性名是否为表中字段名
     * @Date        :      2015年10月26日
     * @param code
     * @return
     * @throws AppException
     */
    public boolean isExitsInTable(String code) throws AppException;

    /**
     * 根据表名获取该表列名的集合
     * @Date        :      2015年10月26日
     * @param tableName
     * @return
     * @throws AppException
     */
    public List<String> getCodeListFromTable(String tableName) throws AppException;

    /**
     * 根据value，type获取对应code
     * @Date        :      2015年10月27日
     * @param value
     * @param type
     * @return
     * @throws AppException
     */
    public String getCodeByValueAndType(String value, String type) throws AppException;
    
    /**
     * @Date        :      2015年11月15日
     * @param value
     * @param type
     * @return
     * @throws AppException
     */
    public List<CodeInfo> getCodeInfoByValueAndType(String value, String type) throws AppException;

    /**
     * 根据定义结果拼接SQL
     * @Date        :      2015年10月27日
     * @param attrNameList
     * @param operatorList
     * @param attrValueList
     * @param sql
     * @param select
     * @param where
     * @param from
     * @return
     * @throws AppException
     */
    public StringBuilder showViewSQL(String[] attrNameList,String[] operatorList,String[] attrValueList,StringBuilder where) throws AppException; 
    
    public List<ServiceInfoDefDto> getViewForService(String sql) throws AppException;

    public List<TyreProductDto> getViewForTyre(String sql) throws AppException;

    public List<OtherProductDto> getViewForOtherProduct(String sql) throws AppException;

    /**
     * @Date        :      2015年10月28日
     * @param sql
     * @throws AppException
     */
    public void saveSql(String sql) throws AppException;

    /**
     * @Date        :      2015年10月29日
     * @param id
     * @throws AppException
     */
    public void deleteSqlById(Long id) throws AppException;

    /**
     * @Date        :      2015年10月28日
     * @param sql
     * @return
     * @throws AppException
     */
    public Long querySql(String sql) throws AppException;

    /**
     * @Date        :      2015年10月28日
     * @param id
     * @return
     * @throws AppException
     */
    public String querySqlById(Long id) throws AppException;

    /**
     * 根据套餐ID查询价目表信息
     * @param ticketLinePriceDto
     * @return
     * @throws AppException
     */
    public List<TicketLinePriceModel> getMealPriceListByPackageId(TicketLinePriceDto ticketLinePriceDto)
                                                                                                        throws AppException;

    /**
     * 价目表信息新新增
     * @param dto
     * @return
     * @throws AppException
     */
    public boolean saveMealPriceinfo(TicketLinePriceDto dto) throws AppException;
    
    /**
     * 保存提货券行的地域性价格
     * @Date        :      2015年11月3日
     * @param dto
     * @throws AppException
     */
    public boolean saveTicketPriceOfDealer() throws AppException;
    
    public DealerInScopeDto saveTicketPriceMethod(TicketLinePriceModel ticketLine,String code) throws AppException;

    /**
     * 根据价目表ID删除价目表信息
     * @param dto
     * @return
     * @throws AppException
     */
    public boolean removeMealPriceById(Long id) throws AppException;

    /**
     * 根据参数查询价目表信息
     * @param dto
     * @return
     * @throws AppException
     */
    public TicketLinePriceModel getMealPriceInfo(TicketLinePriceDto dto) throws AppException;

    /**
     * 修改价目表信息
     * @param dto
     * @return
     * @throws AppException
     */
    public boolean updateMealPriceInfo(TicketLinePriceDto dto) throws AppException;

    /**
     * 根据提货券ID查询价目表信息
     * @param dto
     * @return
     * @throws AppException
     */
    public List<TicketLinePriceModel> getMealPriceByTicketId(TicketLinePriceDto dto)
                                                                                    throws AppException;

    /**
     * 根据优惠券和提货券ID删除价目表信息
     * @param ticketId
     * @throws AppException
     */
    public void removeMealPriceByTicketId(Long ticketId) throws AppException;

    /**
     * 根据优惠券和提货券的ID查询有效状态的套餐是否存在
     * @param ticKetDefineDto
     * @return
     * @throws AppException
     */
    public boolean getMealModelListByTicketId(TicKetDefineDto ticKetDefineDto) throws AppException;
    
    /**
     * 根据类型值获取codeValue
     * @Date        :      2015年11月10日
     * @param partTypeValue
     * @return
     * @throws AppException
     */
    public List<CodeInfo> getCodeValue(String partTypeValue) throws AppException;
    
    /**
     * 根据codeValue获得code
     * @Date        :      2015年11月10日
     * @param codeValue
     * @return     * @throws AppException
     */
    public String getCode(String codeValue,String codeType) throws AppException;
    
    /**
     * 根据codeType类型获取类型值
     * @Date        :      2015年11月11日
     * @param codeType
     * @return
     * @throws AppException
     */
    public List<String> getTypeValueList(String codeType) throws AppException;
    
    /**
     * 由main_group或sub_group类型获取position_group
     * @Date        :      2015年11月12日
     * @param codeType
     * @return
     * @throws AppException
     */
    public List<String> getPositionGroupList(String productType,String productTypeValue) throws AppException;
    
    /**
     * 根据CodeTypeList获取codeValue(多个codeType对应的codeValue取交集)
     * @Date        :      2015年11月12日
     * @param codeTypeList
     * @return
     * @throws AppException
     */
    public List<String> getCodeValueByCodeTypeList(List<String> codeTypeList) throws AppException;
    
    public List<String> getCodeByValue(String value) throws AppException;
    
    public List<String> getParentCodeByValue(String value) throws AppException;
    
    public String getParentCodeByCodeType(String type) throws AppException;
    
    
    /**
     * 根据dealerId, ticketLineId,objectType获取地方差异价格
     * @Date        :      2015年11月19日
     * @param dealerId
     * @param ticketLineId
     * @param objectType
     * @return
     * @throws AppException
     */
    public List<TicketPriceOfDealer> getTicketPriceOfDealerByDealerIdAndTicketLineIdAndObjType(Long dealerId, Long ticketLineId, String objectType) throws AppException;
    
}
